package cn.sccl.common.dao;

import cn.sccl.common.model.PageResult;
import cn.sccl.common.dao.impl.BaseQuery;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface BaseDAO<T> {
    /**
     * 根据ID获取对象.
     */
    public abstract T get(Serializable id);

    /**
     * @param ids
     * @return
     * @Title: get
     * @Description: TODO
     * @createdBy:raoifeng
     * @createaAt:2014-6-23下午09:51:10
     */
    public <T> List<T> gets(List<String> ids);


    /**
     * 获取全部对象.
     */
    public abstract List<T> listAll();


    @SuppressWarnings("unchecked")
    public abstract String getIdName(Class clazz);


    public abstract String getPrimaryKeyName();

    public abstract void setPrimaryKeyName(String primaryKeyName);


    /**
     * 通过对象传递多个参数进行批量删除。如果数据加载缓存使用，则需要开发人员编写额外代码清空缓存
     *
     * @param o
     */
/**    public abstract void delete(Object o);**/

    /**
     * 根据ID移除对象.
     */
    public abstract void delete(Serializable id, String... otherArgs);

    /**
     * 保存对象. 为了实现IEntityDao 我在内部使用了insert和upate 2个方法.
     */
    public abstract void save(T o);

    /**
     * 保存对象. 为了实现IEntityDao 我在内部使用了insert和upate 2个方法.
     * isupdateMC(true:更新缓存；false:清空缓存)
     *
     * @param o
     * @param isupdateMC
     */
    public abstract void save(T o, boolean isupdateMC);

    /**
     * 新增记录，主键通过sequence获取
     *
     * @param o
     */
    public abstract void insert(Object o);

    /**
     * 新增记录，主键在程序中指定
     *
     * @param o
     */
    public abstract void insertWithPrimaryKey(Object o);

    /**
     * 数据更新
     *
     * @param o
     */
    public abstract void update(Object o);

    /**
     * 数据更新 isupdateMC(true:更新缓存；false:清空缓存)
     *
     * @param o
     * @param isupdateMC
     */
    public abstract void update(Object o, boolean isupdateMC);

    /**
     * 分页查询
     *
     * @param query
     * @return
     */
    public abstract List<T> query(BaseQuery query);


    /**
     * 根据值键对查询
     */
    public abstract List<T> findBy(Map<String, Object> map);


    /**
     * 根据值键对模糊查询
     */
    public abstract List<T> findByLike(Map<String, Object> map);

    /**
     * 根据条件查询单个对象.
     *
     * @return 符合条件的唯一对象
     */
    public abstract T findUniqueBy(Map<String, Object> map);

    /**
     * @Title: updatePartialModel
     * @Description: 更新部分字段
     * @Return: void
     * @Throws:
     * @Author: bieby
     * @Date: 2013-11-9
     */
    public void updatePartialModel(Object o);

    /**
     * @param o             需要保存的对象
     * @param aryNullFields 需要保持为null值的属性数组
     * @Title: updatePartialModel
     * @Description: 更新部分字段
     * @Return: void
     * @Throws:
     * @Author: zhouxinxi
     * @Date: 2013-12-21
     */
    public abstract void updatePartialModel(Object o, String[] aryNullFields);

    /**
     * @param key T中某个属性
     * @param map 查询条件
     * @return
     * @Title: findMapBy
     * @Description: 查询结果缓存map
     * @Return: Map<String,T>
     * @Throws:
     * @Author: bieby
     * @Date: 2013-11-23
     */
    public Map<String, T> findMapBy(String key, Map<String, Object> map);

    /**
     * @param key T中某个属性
     * @param map 查询条件
     * @return
     * @Title: findMapByLike
     * @Description: 查询结果缓存map
     * @Return: Map<String,T>
     * @Throws:
     * @Author: bieby
     * @Date: 2013-11-23
     */
    public Map<String, T> findMapByLike(String key, Map<String, Object> map);

    /**
     * 分页查询，所有条件要求满足完全匹配，即where语句不会应用like条件
     *
     * @param pageIndex 页码
     * @param pageSize  分页大小
     * @param params
     * @return
     */
    public <T> PageResult<T> pageQuery(long pageIndex, int pageSize, Map<String, Object> params);

    /**
     * 分页查询，字符串属性在where语句应用like条件
     *
     * @param pageIndex 页码
     * @param pageSize  分页大小
     * @param params
     * @return
     */
    public <T> PageResult<T> pageQueryByLike(long pageIndex, int pageSize, Map<String, Object> params);
}
